package org.dlsu.pdfgen.gui;

import java.net.URI;

import java.awt.Desktop;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JLabel;

public class JHyperlinkLabel extends JLabel {
	private Color underlineColor = null;
	private String link;

	public JHyperlinkLabel(String label, String link) {
		super(label);
		setLink(link);
		setForeground(Color.BLUE.darker());
		setCursor(new Cursor(Cursor.HAND_CURSOR));
		addMouseListener(new HyperlinkLabelMouseAdapter());
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);

		g.setColor(underlineColor == null ? getForeground() : underlineColor);

		Insets insets = getInsets();

		int left = insets.left;
		if (getIcon() != null)
			left += getIcon().getIconWidth() + getIconTextGap();

		g.drawLine(left, getHeight() - 1 - insets.bottom,
				(int) getPreferredSize().getWidth() - insets.right, getHeight()
						- 1 - insets.bottom);
	}

	public class HyperlinkLabelMouseAdapter extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent e) {
			openURI();
		}
	}

	public Color getUnderlineColor() {
		return underlineColor;
	}

	public void setUnderlineColor(Color underlineColor) {
		this.underlineColor = underlineColor;
	}

	public void openURI() {
		java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

		if (!java.awt.Desktop.isDesktopSupported()) {

			System.err.println("Desktop is not supported (fatal)");
			System.exit(1);
		}

		if (!desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {

			System.err
					.println("Desktop doesn't support the browse action (fatal)");
			System.exit(1);
		}

		try {
			java.net.URI uri = new java.net.URI(link);
			desktop.browse(uri);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}

	}

	public String getLink() {
		return link;
	}

	public void setLink(String link) {
		this.link = link;
	}

}
